<?php
/**
* 常用表单验证类
*/
class FormValidate
{
    /** 验证是否为指定长度的字母大小写/数字组合
     * @param $num1 字符串的最小长度
     * @param $num2 字符串的最大长度
     * @param $str  待验证的字符串
     * @return bool 返回逻辑值
     */
function Is_WordNumeric($num1,$num2,$str)
{
     Return (preg_match("/^[a-zA-Z0-9]{".$num1.",".$num2."}$/",$str))?true:false;
}

    /** 用户账号验证 字母开头 允许大小写字母和数字、下划线，5 到16字节长度
     * @param $str 待验证用户名
     * @return bool 返回逻辑值
     */
function Is_UserCount($str){
    Return (preg_match("/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/",$str))?true:false;
}

    /** 密码验证 允许长度6 到16位 包含字符\~!@#$%^&*()-_+=|{}[]\:;'"
     * @param $str 待验证密码
     * @param $minLen 限制最小长度 默认6
     * @param $maxLen 限制最大长度16
     * @return bool  返回逻辑值
     */
function Is_PassWord($str,$minLen =5 ,$maxLen=16)
{
   Return (preg_match("/^[\\~!@#$%^&*()-_=+|{}\[\],.?\/:;\'\"\d\w]{".$minLen.",".$maxLen."}$/",$str))?true:false;
}

    /** 验证是否为指定长度数字
     * @param $num1 指定数字最小位数长度
     * @param $num2 指定数字最大位数长度
     * @param $str  待验证数字
     * @return bool 返回逻辑值
     */
function Is_Numeric($num1,$num2,$str)
{
     return (preg_match("/^[0-9]{".$num1.",".$num2."}$/i",$str))?true:false;
}
    /** 验证是否为指定长度汉字
     * @param $num1 指定最小长度
     * @param $num2 指定最大长度
     * @param $str  待验证字符串
     * @return bool 返回逻辑值
     */
function Is_Hanzi($num1,$num2,$str)
{
// preg_match("/^[\xa0-\xff]{1,4}$/", $string);
    return (preg_match("/^([\x81-\xfe][\x40-\xfe]){".$num1.",".$num2."}$/",$str))?true:false;
}
    /** 验证身份证号码
     * @param $id 待验证身份证号码
     * @return bool 返回逻辑值
     */
    function Is_idcard( $id )
    {
        $id = strtoupper($id);
        $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
        $arr_split = array();
        if(!preg_match($regx, $id))
        {
            return FALSE;
        }
        if(15==strlen($id)) //检查15位
        {
            $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";

            @preg_match($regx, $id, $arr_split);
            //检查生日日期是否正确
            $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
            if(!strtotime($dtm_birth))
            {
                return FALSE;
            } else {
                return TRUE;
            }
        }
        else      //检查18位
        {
            $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
            @preg_match($regx, $id, $arr_split);
            $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4];
            if(!strtotime($dtm_birth)) //检查生日日期是否正确
            {
                return FALSE;
            }
            else
            {
                //检验18位身份证的校验码是否正确。
                //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
                $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                $sign = 0;
                for ( $i = 0; $i < 17; $i++ )
                {
                    $b = (int) $id{$i};
                    $w = $arr_int[$i];
                    $sign += $b * $w;
                }
                $n = $sign % 11;
                $val_num = $arr_ch[$n];
                if ($val_num != substr($id,17, 1))
                {
                    return FALSE;
                } //phpfensi.com
                else
                {
                    return TRUE;
                }
            }
        }

    }

    /** 验证邮件地址
     * @param $str 待验证邮件地址
     * @return bool 返回逻辑值
     */
    function Is_email($str){
     return (preg_match('/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/',$str))?true:false;
}
    /** 验证固定电话号码 0XXX-XXXXXX
     * @param $str
     * @return bool
     */
function Is_phone($str)
{
   return (preg_match("/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/",$str))?true:false;
}
    /** 验证邮编
     * @param $str 待验证邮政编码
     * @return bool 返回逻辑值
     */
function Is_zip($str)
{
   return (preg_match("/^[1-9]\d{5}$/",$str))?true:false;
}
    /** 验证url地址
     * @param $str 待验证网址
     * @return bool 返回逻辑值
     */
function Is_url($str)
{
   return (preg_match("/^^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+$/",$str))?true:false;
}
    /** 数据入库 转义 特殊字符 传入值可为字符串 或 一维数组
     * @param $data 待转义的字符串
     * @return array|string 返回转义后的字符串
     */
function data_join(&$data)
{
   if(get_magic_quotes_gpc() == false)
   {
    if (is_array($data))
    {
     foreach ($data as $k => $v)
     {
     $data[$k] = addslashes($v);
     }
    }
    else
    {
    $data = addslashes($data);
    }
   }
   Return $data;
}
    /** 数据出库 还原 特殊字符 传入值可为字符串 或 一/二维数组
     * @param $data 数据库读出哦字符串
     * @return array|string 还原为正常的字符串
     */
function data_revert(&$data)
{
   if (is_array($data))
   {
    foreach ($data as $k1 => $v1)
    {
     if (is_array($v1))
     {
      foreach ($v1 as $k2 => $v2)
      {
      $data[$k1][$k2] = stripslashes($v2);
      }
     }
     else
     {
     $data[$k1] = stripslashes($v1);
     }
    }
   }
   else
   {
   $data = stripslashes($data);
   }
   Return $data;
}

// 数据显示 还原 数据格式 主要用于内容输出 传入值可为字符串 或 一/二维数组

// 执行此方法前应先data_revert()，表单内容无须此还原

function data_show(&$data)
{
   if (is_array($data))
   {
    foreach ($data as $k1 => $v1)
    {
     if (is_array($v1))
     {
      foreach ($v1 as $k2 => $v2)
      {
      $data[$k1][$k2]=nl2br(htmlspecialchars($data[$k1][$k2]));
      $data[$k1][$k2]=str_replace(" "," ",$data[$k1][$k2]);
      $data[$k1][$k2]=str_replace("\n","<br>\n",$data[$k1][$k2]);
      }
     }
     else
     {
     $data[$k1]=nl2br(htmlspecialchars($data[$k1]));
     $data[$k1]=str_replace(" "," ",$data[$k1]);
     $data[$k1]=str_replace("\n","<br>\n",$data[$k1]);
     }
    }
   }
   else
   {
   $data=nl2br(htmlspecialchars($data));
   $data=str_replace(" "," ",$data);
   $data=str_replace("\n","<br>\n",$data);
   }
   Return $data;
}
}


